package com.odontosis.util;

import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;

public class StringUtilsOdontosis {
	
	private static DecimalFormat df = new DecimalFormat();

	static {
	        DecimalFormatSymbols symbols = new DecimalFormatSymbols();
	        symbols.setDecimalSeparator(',');
	        symbols.setGroupingSeparator('.');
	        df.setDecimalFormatSymbols(symbols);
	        df.setDecimalSeparatorAlwaysShown(true);
	        df.setRoundingMode(RoundingMode.HALF_EVEN);
	    }

	public static String formatarDouble(Double decimal, int decimais) {
	        if (decimal == null) {
	            return "";
	        }
	        df.setMinimumFractionDigits(decimais);
	        df.setMaximumFractionDigits(decimais);
	        return df.format(decimal);
	}
	
	public static String formatarDouble(Double valor){
//		 String s = new DecimalFormat("0.00").format(valor);       
//		 int index = s.indexOf(',');
//		 String s2 = s.substring(0, index) + "." + s.substring(index + 1);
//		 return s2.replace('.', ',');
		return formatarDouble(valor, 2);
	}
	
	public static String DateToString(Date data){
		 if(data == null) return "";
		 SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		 return sdf.format(data);
	}
	
	public static Date StringToDate(String strData){
		 if(isVazia(strData)) return null;
		 SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		 Date data = null;
		 try{
		 	data = sdf.parse(strData);
		 }catch (Exception e) {
			 throw new IllegalArgumentException("data não válida");
		}
		 return data;
	}
	
	public static boolean isDateValid(String dataStr) {
		if(isVazia(dataStr)){
			return false;
		}
	     SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
	     sdf.setLenient(false) ; // o moço que vai ver se os numeros ultrapassam o permitido!
	     try {
	           Date data = sdf.parse(dataStr);
	     } catch(ParseException e){
	        return false;
	     }
	     return true;
	}
	
	public static boolean isVazia(String texto){
		if(texto == null || texto.trim().length() == 0){
			return true;
		}
		return false;
	}
	
	public static String formatarMes(String texto){
		try{
			Integer a = Integer.parseInt(texto) - 1;
			return a.toString();
		}catch (Exception e) {
			return "";
		} 
	}
	
	public static boolean isInteger(String numero){
		try{
			Integer.parseInt(numero);
			return true;
		}catch (Exception e) {
		}
		return false;
	}
	
	public static String colocaZeros(String conteudo, int tamanho){
		if(isVazia(conteudo)){
			return "-";
		}
		int nzeros = tamanho - conteudo.length();
		String inicio = "";
		for (int i=0 ; i <nzeros ; i++) {
			inicio += "0";
		}
		return inicio + conteudo;
	}
	
	public static int diffEmMeses(Date dataInicial, Date dataFinal){
		
		  GregorianCalendar startTime = new GregorianCalendar();
	        GregorianCalendar endTime = new GregorianCalendar();
	        
	        GregorianCalendar curTime = new GregorianCalendar();
	        GregorianCalendar baseTime = new GregorianCalendar();

	        startTime.setTime(dataInicial);
	        endTime.setTime(dataFinal);
	        
	        int dif_multiplier = 1;
	        
	        // Verifica a ordem de inicio das datas
	        if( dataInicial.compareTo( dataFinal ) < 0 ){
	            baseTime.setTime(dataFinal);
	            curTime.setTime(dataInicial);
	            dif_multiplier = 1;
	        }else{
	            baseTime.setTime(dataInicial);
	            curTime.setTime(dataFinal);
	            dif_multiplier = -1;
	        }
	        
	        int result_years = 0;
	        int result_months = 0;
	        int result_days = 0;

	        // Para cada mes e ano, vai de mes em mes pegar o ultimo dia para import acumulando
	        // no total de dias. Ja leva em consideracao ano bissesto
	        while( curTime.get(GregorianCalendar.YEAR) < baseTime.get(GregorianCalendar.YEAR) ||
	               curTime.get(GregorianCalendar.MONTH) < baseTime.get(GregorianCalendar.MONTH)  )
	        {
	            
	            int max_day = curTime.getActualMaximum( GregorianCalendar.DAY_OF_MONTH );
	            result_months += max_day;
	            curTime.add(GregorianCalendar.MONTH, 1);
	            
	        }
	        
	        // Marca que � um saldo negativo ou positivo
	        result_months = result_months*dif_multiplier;
	        
	        
	        // Retirna a diferenca de dias do total dos meses
	        result_days += (endTime.get(GregorianCalendar.DAY_OF_MONTH) - startTime.get(GregorianCalendar.DAY_OF_MONTH));
	        
	        return result_months;
	}

}
